Sniffer e TCP/IP
Normalmente
solo l'interfaccia del destinatario passa i dati allo strato superiore, quindi i dati che passano sul cavo di rete
vengono presi solo dalla macchina il cui indirizzo IP e/o MAC fa matching con quello contenuto nell'header del frame:
Dalla figura si vede come la macchina dell'utente A (il Link Layer A)
non fa passare il pacchetto e quindi non trasferisce nulla agli strati superiori; la
macchina dell'utente B (Link Layer B), invece, essendo il destinatario del pacchetto, lo lascia
passare e lo trasferisce agli strati superiori.
Le API del sistema operativo permettono di leggere tutto
ciò che passa sul canale ponendo l'interfaccia di rete in modalità promiscua.
In tal caso i dati vengono consegnati all'applicazione che li richiede in modo
grezzo, senza che essi passino attraverso gli opportuni strati del protocollo.
Resta a carico dello sniffer effettuare un'interpretazione dei pacchetti
e assemblare i dati.
La figura mostra cosa accade all'interno di un Sistema Operativo:
supponiamo di avere un'istanza di natscape associata dal sistema ad una determinata porta;
ora questa istanza passa attraverso il protocollo TCP/IP prima di accedere al cavo. A questo
punto, attraverso il dispositivo Ethernet, viene fatta una copia dei pacchetti inviati e dei pacchetti
ricevuti e poichè il programma di Sniffing "TCPdump" ha settato l'intefaccia in modalità promiscua,
tutti i dati saranno consegnati a questa applicazione attraverso il filtro del Sistema Operativo.
Nei sistemi Unix la programmazione di rete avviene
mediante i socket. Mediante queste API il programmatore ottiene un
controllo più o meno elevato della comunicazione in rete, ma deve anche gestire
molti dettagli implementativi. Esistono per questo molte librerie che
semplificano l'utilizzo della rete. La libreria pcap
(Packet Capture) rende
relativamente semplice la cattura dei pacchetti. Molti sistemi hanno già
installate le pcap, che sono comunque disponibili gratuitamente su
Internet. Questa libreria offre un'interfaccia di programmazione per la cattura
dei pacchetti di facile utilizzo e indipendente dal tipo di dispositivo di
rete.
TCP/IP non offre nessun meccanismo di verifica o
protezione dei dati. I dati viaggiano in chiaro e non è fornito nessun modo per
garantire l'autenticità degli interlocutori, sebbene ciò possa essere fatto
dalle applicazioni.
Ciascuna macchina su cui viaggiano i dati potrebbe
visualizzarli o anche modificarli. Se un'applicazione gestisce a basso livello
la connessione può addirittura falsificare la propria identità in quanto TCP/IP
si fida semplicemente dell'indirizzo specificato dal
mittente. Anche a livello applicativo non vengono ancora adottati
automaticamente strumenti per garantire l'autenticità e la privacy dei dati.
Recentemente alcune applicazioni stanno ponendo maggiore attenzione al
problema. Con alcune applicazioni per la gestione della posta elettronica
è possibile apporre la propria firma. Un'altra caratteristica di TCP/IP
utilizzata dagli sniffer è il numero di sequenza dei segmenti TCP. Tale numero
viene scambiato tra i due lati della connessione TCP per garantire l'ordine e
il regolare flusso dei pacchetti. La determinazione del valore iniziale di tale
numero dipende da alcuni fattori delle macchine che si connettono e viene
incrementato ogni volta che si invia un pacchetto. Supponiamo che Alice e Bob
abbiano stabilito una connessione. Si sono quindi scambiati i rispettivi numeri
di sequenza. Supponiamo che Mark voglia inviare dei pacchetti ad Alice
spacciandosi per Bob. Specificare l'indirizzo di Bob come mittente non è un
problema ma se il numero di sequenza inviato da Mark non rispetta quelli
scambiati tra Alice e Bob il pacchetto di Mark sarà scartato e verrà inviato da
Alice a Bob un messaggio di errore.
Uno sniffer però conosce i numeri di sequenza, in
quanto viaggiano in chiaro, può quindi usarli per sostituirsi ad un altro
utente. Lo sniffer prima ascolta e conserva i numeri di sequenza di una
connessione TCP poi, ponendo un attacco DoS, ad esempio al client, lo rende
incapace di comunicare con il server. Nel frattempo si intromette nella
comunicazione sostituendosi al client. In questo modo, anche se il server ha
effettuato un riconoscimento, magari cifrato, l'intruso potrebbe continuare le
operazioni spacciandosi per il client senza che il server possa accorgersene.